//
//  CZEmotionInputView.swift
//  表情键盘
//
//  Created by youyoumacmini3 on 2017/8/14.
//  Copyright © 2017年 youyoumacmini3. All rights reserved.
//

import UIKit

// 可重用标识符
private let cellId = "cellId"

/// 表情输入视图
class CZEmotionInputView: UIView {

    // 放置表情view
    @IBOutlet weak var collectionView: UICollectionView!
    // 底部工具栏
    @IBOutlet weak var toolBar: CZEmotionToolBar!
    // 分页控件
    @IBOutlet weak var pageControl: UIPageControl!
    
    /// 选中表情回调闭包属性
    fileprivate var selectedEmotionCallBack:((_ emtion: CZEmotion?)->())?
    
    /// 加载并且返回输入视图
    class func inputView(selectedEmotion: @escaping (_ emtion: CZEmotion?)->()) -> CZEmotionInputView {
        
        let nib = UINib(nibName: "CZEmotionInputView", bundle: nil)
        let v = nib.instantiate(withOwner: nil, options: nil)[0] as! CZEmotionInputView
        
        // 记录闭包
        v.selectedEmotionCallBack = selectedEmotion
        
        
        return v
    }
    
    override func awakeFromNib() {
        
        // 注册可重用cell
        collectionView.register(CZEmotionCell.self, forCellWithReuseIdentifier: cellId)
//        let nib = UINib(nibName: "CZEmotionCell", bundle: nil)
//        collectionView.register(nib, forCellWithReuseIdentifier: cellId)
        
        // 设置工具栏代理
        toolBar.delegate = self
        
        // b. 设置分页控件图片
        let bundle = CZEmotionManager.shared.bundle
        
        guard let nomalImage = UIImage(named: "compose_keyboard_dot_normal", in: bundle, compatibleWith: nil),
            let selectedImage = UIImage(named: "compose_keyboard_dot_selected", in: bundle, compatibleWith: nil) else {
                return
        }
        // 使用填充图片设置颜色
        //pageControl.pageIndicatorTintColor = UIColor(patternImage: nomalImage)
        //pageControl.currentPageIndicatorTintColor = UIColor(patternImage: selectedImage)
        
        // 用封装好的 NSObject+CZRuntime 方法可查类的成员变量
        // 使用 KVC 设置私有成员属性
        pageControl.setValue(nomalImage, forKey: "_pageImage")
        pageControl.setValue(selectedImage, forKey: "_currentPageImage")

        
    }
}

extension CZEmotionInputView: CZEmotionToolBarDelegate {
    
    func emotionToolBarDidSelectedItemIndex(toolbar: CZEmotionToolBar, index: Int) {
        
        // 让 collectionView 发生滚动
        let indexPath = IndexPath(item: 0, section: index)
        collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
        
        // 设置分组按钮的选中状态
        toolBar.selectedIndex = index
    }
}

// MARK: - UICollectionViewDelegate
extension CZEmotionInputView: UICollectionViewDelegate{
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 1. 获取中心点
        var center = scrollView.center
        center.x += scrollView.contentOffset.x
        
        // 2. 获取当前显示 cell 的 indexPath
        let paths = collectionView.indexPathsForVisibleItems
        
        // 3. 判断中心点在哪一个 indexPath 上，在哪一个页面上
        var targetIndexPath: IndexPath?
        
        for indexPath in paths {
            
            // 1> 根据 indexpath 获得cell
            let cell = collectionView.cellForItem(at: indexPath)
            
            // 2> 判断中心点位置
            if cell?.frame.contains(center) == true {
                targetIndexPath = indexPath
                break
            }
        }
        // 4. 判断是否找到目标的 indexpath
        // indepath.section 对应的就是分组
        guard let target = targetIndexPath else { return }
        toolBar.selectedIndex = target.section
        
        // 5. 设置分页控件
        // a. 不同的分组页数不一样
        pageControl.numberOfPages = collectionView.numberOfItems(inSection: target.section)
        pageControl.currentPage = target.item
        
        
           }
}

// MARK: - UICollectionViewDataSource
extension CZEmotionInputView: UICollectionViewDataSource {
    
    // 分组数量 - 表情包数量
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return CZEmotionManager.shared.packages.count
    }
    
    // 每个分组中表情 ‘页’ 的数量
    // emotions 数组 / 20
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return CZEmotionManager.shared.packages[section].numOfPages
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // 1. 取 cell
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! CZEmotionCell
        
        // 2. 设置 cell - 传递对应页面的表情数组
        cell.emotions = CZEmotionManager.shared.packages[indexPath.section].emotion(page: indexPath.item)
        
        // 设置代理 - 不适合用闭包
        cell.delegate = self
        
        // 3. 返回 cell
        return cell
    }
    
}

extension CZEmotionInputView: CZEmotionCellDelegate {
    
    // 选中的表情回调
    //
    // cell： 分页cell
    // em：   选中的表情，删除键为 nil
    func emotionCellDidSelectedEmotion(cell: CZEmotionCell, em: CZEmotion?) {
        //print(em)
        // 执行闭包回调选中的表情
        selectedEmotionCallBack?(em)
        
        // 添加最近使用的表情
        guard let em = em else {
            return
        }
        
        // 如果当前 collectionView 就是最近的分组，不添加最近使用的表情
        let indexPath = collectionView.indexPathsForVisibleItems[0]
        if indexPath.section == 0 {
            return
        }
        
        // 添加最近使用的表情
        CZEmotionManager.shared.recentEmotion(em: em)
    
        // 刷新数据 - 第 0 组
        var indexSet = IndexSet()
        indexSet.insert(0)
        
        collectionView.reloadSections(indexSet)
    
    }
}

